"""睡眠监测指标模型

基于Peewee ORM的睡眠监测指标表映射
存储睡眠分析结果和建议
"""

import json
from datetime import datetime
from peewee import *
from app.core.database import BaseModel


class SleepMonitoringMetrics(BaseModel):
    """睡眠监测指标模型
    
    存储睡眠分析结果和建议
    用于分析用户的睡眠状态和脑波活动模式
    """
    
    id = AutoField(primary_key=True, help_text="自动生成的主键ID")
    session_id = CharField(max_length=100, unique=True, help_text="会话ID")
    room_id = CharField(max_length=36, index=True, help_text="所属房间ID")
    user_id = CharField(max_length=50, null=True, help_text="用户ID（可选）")
    
    # 分析结果
    analysis_time = DateTimeField(help_text="分析时间")
    sleep_state = CharField(max_length=20, help_text="睡眠状态")
    frequency_ratios = TextField(null=True, help_text="频段比例数据，JSON格式")
    quality_score = FloatField(null=True, help_text="睡眠质量分数")
    recommendations = TextField(null=True, help_text="建议列表，JSON格式")
    
    created_at = DateTimeField(default=datetime.now, help_text="记录创建时间")
    start_time = DateTimeField(help_text="开始时间")
    total_seconds = IntegerField(help_text="总秒数")
    
    # 8个频段的JSON数据
    delta_ratio = TextField(null=True, help_text="Delta波比例数据，JSON格式")
    theta_ratio = TextField(null=True, help_text="Theta波比例数据，JSON格式")
    low_alpha_ratio = TextField(null=True, help_text="低Alpha波比例数据，JSON格式")
    high_alpha_ratio = TextField(null=True, help_text="高Alpha波比例数据，JSON格式")
    low_beta_ratio = TextField(null=True, help_text="低Beta波比例数据，JSON格式")
    high_beta_ratio = TextField(null=True, help_text="高Beta波比例数据，JSON格式")
    low_gamma_ratio = TextField(null=True, help_text="低Gamma波比例数据，JSON格式")
    mid_gamma_ratio = TextField(null=True, help_text="中Gamma波比例数据，JSON格式")
    
    states = TextField(null=True, help_text="状态数据，JSON格式")
    confidence = TextField(null=True, help_text="置信度数据，JSON格式")
    updated_at = DateTimeField(default=datetime.now, help_text="更新时间")
    
    class Meta:
        table_name = 'sleep_monitoring_metrics'
        indexes = (
            (('room_id',), False),
        )
    
    def get_frequency_ratios(self) -> dict:
        """获取频段比例数据
        
        Returns:
            dict: 频段比例数据
        """
        if self.frequency_ratios:
            return json.loads(self.frequency_ratios)
        return {}
    
    def set_frequency_ratios(self, ratios: dict):
        """设置频段比例数据
        
        Args:
            ratios: 频段比例数据字典
        """
        self.frequency_ratios = json.dumps(ratios)
    
    def get_recommendations(self) -> list:
        """获取建议列表
        
        Returns:
            list: 建议列表
        """
        if self.recommendations:
            return json.loads(self.recommendations)
        return []
    
    def set_recommendations(self, recommendations: list):
        """设置建议列表
        
        Args:
            recommendations: 建议列表
        """
        self.recommendations = json.dumps(recommendations)
    
    def get_ratio_data(self) -> float:
        """获取比例数据（用于测试兼容性）
        
        Returns:
            float: 比例数据
        """
        ratios = self.get_frequency_ratios()
        if ratios:
            # 返回第一个比例值或计算平均值
            return list(ratios.values())[0] if ratios else 0.0
        return 0.0
    
    def get_state_data(self) -> list:
        """获取状态数据（用于测试兼容性）
        
        Returns:
            list: 状态数据列表
        """
        return [self.sleep_state] if self.sleep_state else []
    
    def to_dict(self) -> dict:
        """转换为字典格式
        
        Returns:
            dict: 字典格式的数据
        """
        return {
            'id': self.id,
            'session_id': self.session_id,
            'room_id': self.room_id,
            'user_id': self.user_id,
            'analysis_time': self.analysis_time.isoformat() if self.analysis_time else None,
            'sleep_state': self.sleep_state,
            'frequency_ratios': self.get_frequency_ratios(),
            'quality_score': self.quality_score,
            'recommendations': self.get_recommendations(),
            'created_at': self.created_at.isoformat() if self.created_at else None
        }